% 周期矩形脉冲信号的傅里叶级数与频谱分析
clear; clc; close all;

% 参数设置
T0 = 2;         % 信号周期
tau = 1;        % 脉冲宽度
N = 10;         % 谐波阶数
t = linspace(-T0, T0, 1000); % 时间轴

% 1. 计算傅里叶级数系数
% x(t) = 矩形脉冲序列，幅值为1，宽度为tau，周期为T0
% 傅里叶系数公式：Cn = (1/T0) * ∫_{-tau/2}^{tau/2} exp(-j*n*w0*t) dt
% x(t) =  + 0.000*exp(j*-10*3.142*t) + 0.035*exp(j*-9*3.142*t) - 0.000*exp(j*-8*3.142*t) - 0.045*exp(j*-7*3.142*t) + 0.000*exp(j*-6*3.142*t) + 0.064*exp(j*-5*3.142*t) - 0.000*exp(j*-4*3.142*t) - 0.106*exp(j*-3*3.142*t) + 0.000*exp(j*-2*3.142*t) + 0.318*exp(j*-1*3.142*t)0.500 + 0.318*exp(j*1*3.142*t) + 0.000*exp(j*2*3.142*t) - 0.106*exp(j*3*3.142*t) - 0.000*exp(j*4*3.142*t) + 0.064*exp(j*5*3.142*t) + 0.000*exp(j*6*3.142*t) - 0.045*exp(j*7*3.142*t) - 0.000*exp(j*8*3.142*t) + 0.035*exp(j*9*3.142*t) + 0.000*exp(j*10*3.142*t)
w0 = 2*pi/T0;   % 基本角频率
Cn = zeros(1, 2*N+1); % 存储系数
n_vec = -N:N;   % 谐波序号

for idx = 1:length(n_vec)
    n = n_vec(idx);
    if n == 0
        Cn(idx) = tau/T0; % 直流分量
    else
        Cn(idx) = sin(n*w0*tau/2)/(n*pi); % 推导结果
    end
end

% 2. 谐波叠加近似波形
x_approx = zeros(size(t));
for idx = 1:length(n_vec)
    n = n_vec(idx);
    x_approx = x_approx + Cn(idx) * exp(1j*n*w0*t);
end
x_approx = real(x_approx); % 取实部

% 理论波形（理想矩形脉冲序列）
x_theory = zeros(size(t));
for k = -1:1
    x_theory = x_theory + double(abs(t - k*T0) <= tau/2);
end

% 绘制近似波形与理论波形
figure;
plot(t, x_theory, 'k--', 'LineWidth', 1.5); hold on;
plot(t, x_approx, 'b', 'LineWidth', 2);
xlabel('时间 t'); ylabel('幅值');
title(['前' num2str(N) '次谐波叠加的近似波形']);
legend('理论波形', '谐波叠加近似');
grid on;

% 3. 频谱计算与绘制
% 频谱为傅里叶级数系数的幅度谱
figure;
stem(n_vec*w0, abs(Cn), 'filled');
xlabel('角频率 \omega');
ylabel('幅度 |C_n|');
title('信号的频谱');
grid on;

% 4. 参数影响分析（可选，自动多组参数对比）
figure;
subplot(2,1,1);
tau_list = [0.5, 1, 1.5];
for i = 1:length(tau_list)
    tau_tmp = tau_list(i);
    Cn_tmp = zeros(1, 2*N+1);
    for idx = 1:length(n_vec)
        n = n_vec(idx);
        if n == 0
            Cn_tmp(idx) = tau_tmp/T0;
        else
            Cn_tmp(idx) = sin(n*w0*tau_tmp/2)/(n*pi);
        end
    end
    stem(n_vec*w0, abs(Cn_tmp), 'DisplayName', ['\tau=' num2str(tau_tmp)]); hold on;
end
xlabel('\omega'); ylabel('|C_n|');
title('不同 \tau 对频谱的影响');
legend; grid on;

subplot(2,1,2);
T0_list = [1.5, 2, 2.5];
for i = 1:length(T0_list)
    T0_tmp = T0_list(i);
    w0_tmp = 2*pi/T0_tmp;
    Cn_tmp = zeros(1, 2*N+1);
    for idx = 1:length(n_vec)
        n = n_vec(idx);
        if n == 0
            Cn_tmp(idx) = tau/T0_tmp;
        else
            Cn_tmp(idx) = sin(n*w0_tmp*tau/2)/(n*pi);
        end
    end
    stem(n_vec*w0_tmp, abs(Cn_tmp), 'DisplayName', ['T_0=' num2str(T0_tmp)]); hold on;
end
xlabel('\omega'); ylabel('|C_n|');
title('不同 T_0 对频谱的影响');
legend; grid on;

% ----------------------
% 打印傅里叶级数表达式
fprintf('周期矩形脉冲信号的傅里叶级数为：\n');
fprintf('x(t) = ');
for idx = 1:length(n_vec)
    n = n_vec(idx);
    if n == 0
        fprintf('%.3f', real(Cn(idx)));
    else
        if Cn(idx) >= 0
            fprintf(' + ');
        else
            fprintf(' - ');
        end
        fprintf('%.3f*exp(j*%d*%.3f*t)', abs(Cn(idx)), n, w0);
    end
end
fprintf('\n');

% ----------------------
% 注释：T0和tau对频谱的影响
% T0（周期）越大，频谱主瓣越窄，谱线间隔越小，频谱越密集；T0越小，频谱主瓣越宽，谱线间隔越大。
% tau（脉冲宽度）越大，主瓣越窄，旁瓣越低，能量集中在低频；tau越小，主瓣越宽，旁瓣越高，能量分布更分散。
% 直观理解：tau决定单个脉冲的宽度，T0决定周期重复的快慢，两者共同影响频谱的形状和能量分布。


